"""
author：fc
date：  2021/9/24
"""
#
# 使用selenium模拟登录豆瓣，模拟滑动验证,selenium可以模拟人的点击
#
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 导入鼠标控制链
import time
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities  # 改变selenium页面加载情况


def get_tracks(distance):
    """
    拿到移动轨迹，模仿人的滑动行为，先匀加速后匀减速
    匀变速运动基本公式：
    ①v = v0+at
    ②s = v0t+1/2at^2
    """
    # 初速度
    v = 0
    # 单位时间为0.3s来统计轨迹，轨迹即0.3内的位移
    t = 0.31
    # 位置/轨迹列表，列表内的一个元素代表0.3s的位移
    tracks = []
    # 当前位移
    current = 0
    # 到达mid值开始减速
    mid = distance * 4 / 5
    while current < distance:
        if current < mid:
            # 加速度越小，单位时间内的位移越小，模拟的轨迹就越多越详细
            a = 2
        else:
            a = -3
        # 初速度
        v0 = v
        # 0.3秒内的位移
        s = v0 * t + 0.5 * a * (t ** 2)
        # 当前的位置
        current += s
        # 添加到轨迹列表
        tracks.append(round(s))
        # 速度已经到达v,该速度作为下次的初速度
        v = v0 + a * t
    return tracks


# desire_capabilities=DesiredCapabilities.CHROME
# desire_capabilities["pageLoadStrategy"]='none' # driver.get得到后直接返回，不用等到页面加载完成

# 浏览器配置，防止selenium被检测到
options = webdriver.ChromeOptions()
# options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
# options.add_argument(r'--user-data-dir=G:\projects\PycharmProjects\User Data')
# google_driver = "D:\Installation_Package\chromedriver_win32\chromedriver.exe"
# browser = webdriver.Chrome(executable_path=google_driver, options=options)

profile_path=r"C:\Users\fc\AppData\Roaming\Mozilla\Firefox\Profiles\721de3k0.default-release"
profile=webdriver.FirefoxProfile(profile_path)
browser=webdriver.Firefox(firefox_profile=profile)

browser.get("https://www.douban.com")
browser.switch_to.frame(0)  # 传入id属性或者网址，一般传id,0代表第一个fram
pwd_login = browser.find_element_by_xpath("//li[@class='account-tab-account']")  # 元素定位
pwd_login.click()  # 模拟点击，这里会报错，因为密码登录在iframe中,需要进入子界面才能定位到元素

browser.find_element_by_xpath("//*[@id='username']").send_keys("18768788978")
browser.find_element_by_xpath("//*[@id='password']").send_keys("FC18768788978")
browser.find_element_by_xpath(
    "//div[@class='account-form-field-submit ']/a[@class='btn btn-account btn-active']").click()

time.sleep(4)
auth_frame = browser.find_element_by_id('tcaptcha_iframe')
browser.switch_to.frame(auth_frame)
# 滑动验证码破解
slip = browser.find_element_by_xpath("//*[@id='tcaptcha_drag_thumb']")
ActionChains(browser).click_and_hold(on_element=slip).perform()  # 点击并保持点击
ActionChains(browser).move_to_element_with_offset(to_element=slip, xoffset=181, yoffset=0).perform()
tracks = get_tracks(24)
for track in tracks:
    ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()  # 开始移动move_by_offset()
time.sleep(0.5)
ActionChains(browser).release().perform()  # 登录已经攻破 ,跳转到新的页面
time.sleep(1) # 线程睡眠，等待页面加载
browser.refresh() # 页面刷新一下，否则无法获取新页面数据
data = browser.page_source  # 获取当前页面数据
current_url=browser.current_url
title=browser.title
print("题目："+str(title))
print("url："+str(current_url))
print("源码："+str(data))
with open("../files/豆瓣/我的豆瓣主页.html","w",encoding="utf-8") as fh:
    fh.write(str(data))